package tang.Controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import tang.domain.Goods;

import java.util.List;


/*服务调用方*/
@RestController
@RequestMapping("/order")
public class GoodsController {

   /* @Autowired
    private GoodsService goodsService;*/

    @Autowired
    private RestTemplate  restTemplate;

    /*1
        注入DiscoveryClient 对象,并激活  加注解DiscoveryClient
        * */
    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("/goods/{id}")
    public Goods findGoodsbyid(@PathVariable("id") int id){

        /*远程调用goods服务中的fingone服务
        * 使用RestTemplate 模板完成远程调用
        *   1.定义Bean   restTemplate
        * 2.注入bean
        *  3.调用方法
        * */

        /*
        动态从Eureka server中获取 provider的 ip和端口
        1
        注入DiscoveryClient 对象,并激活  加注解DiscoveryClient
        * */

        List<ServiceInstance> instances = discoveryClient.getInstances("EUREKA_PROVIDER");
        if (instances ==null ||instances.size()==0){
            return null;
        }

        //获取集合中第一个元素,因为当前集合只有一个
        ServiceInstance serviceInstance = instances.get(0);

        String host = serviceInstance.getHost(); //获取主机名
        int port = serviceInstance.getPort();    //获取端口号

        System.out.println(host);
        System.out.println(port);

        String url= "http://"+host+":"+port+"/Goods/findOne/"+id;


        //调用方法  * 使用RestTemplate 模板完成远程调用
        Goods goods = restTemplate.getForObject(url, Goods.class);

        return goods;
    }

    @GetMapping("/goods2/{id}")
    public Goods findGoodsbyid2(@PathVariable("id") int id){

       /*
       * 使用Ribbon 简化restTemplate调用
       *  1.在声明restTemplate的Bean时,添加一个注解: @LoadBalanced
       * 2.在使用restTemplate 发起请求时,需药定义url时,host,port可以替换为 服务提供方方 应用名称
       * */
        String url= "http://EUREKA_PROVIDER/Goods/findOne/"+id;


        //调用方法  * 使用RestTemplate 模板完成远程调用
        Goods goods = restTemplate.getForObject(url, Goods.class);

        return goods;
    }
}
